/**
 * Module for downloading m3u8 manifest files using Puppeteer
 */
const puppeteer = require('puppeteer');

/**
 * Download m3u8 manifest content using Puppeteer
 * @param {string} mediaID - The media ID to download
 * @returns {Promise<string>} The m3u8 manifest content
 */
async function downloadM3U8Manifest(mediaID) {
  const m3u8Url = `https://cdn.jwplayer.com/manifests/${mediaID}.m3u8`;
  console.log("  正在获取m3u8内容...: ", m3u8Url);
  
  // 创建新的浏览器实例
  const browser = await puppeteer.launch({
    headless: "new",
  });
  
  try {
    const page = await browser.newPage();
    
    // 设置请求拦截以捕获响应
    await page.setRequestInterception(true);
    
    let m3u8Content = null;
    
    page.on('request', request => {
      if (request.url().includes('manifests')) {
        // 对于manifest请求，继续但准备捕获响应
        request.continue();
      } else {
        // 其他请求也继续
        request.continue();
      }
    });
    
    page.on('response', async response => {
      if (response.url().includes('manifests') && response.status() === 200) {
        try {
          // 尝试获取响应文本
          m3u8Content = await response.text();
        } catch (err) {
          // 忽略错误
        }
      }
    });
    
    // 首先导航到源站以设置正确的上下文和cookies
    await page.goto('https://bigthink.com/', { 
      waitUntil: 'domcontentloaded',
      timeout: 30000 
    });
    
    // 导航到m3u8 URL以触发请求
    try {
      await page.goto(m3u8Url, {
        waitUntil: 'networkidle0',
        timeout: 30000
      });
    } catch (navError) {
      // 忽略导航错误，因为我们通过拦截获取内容
    }
    
    // 如果拦截方法没有获取到内容，尝试其他方法
    if (!m3u8Content) {
      // 方法2: 使用evaluate获取内容
      try {
        m3u8Content = await page.evaluate(async (url) => {
          const response = await fetch(url);
          return await response.text();
        }, m3u8Url);
      } catch (err) {
        // 忽略错误，尝试其他方法
      }
    }
    
    // 如果仍然没有内容，尝试直接获取页面内容
    if (!m3u8Content) {
      try {
        m3u8Content = await page.content();
        // 如果获取的是HTML而不是m3u8内容，这可能不正确
        if (m3u8Content.trim().startsWith('<')) {
          m3u8Content = null; // 这不是我们要的内容
        }
      } catch (err) {
        // 忽略错误
      }
    }
    
    await page.close();
    
    if (!m3u8Content) {
      throw new Error('Failed to download m3u8 manifest content');
    }
    
    console.log("  M3U8 Content:");
    // 只显示前500个字符以避免日志过长
    const contentPreview = m3u8Content.substring(0, 500) + (m3u8Content.length > 500 ? '...' : '');
    console.log(contentPreview);
    
    return m3u8Content;
  } finally {
    // 确保浏览器总是被关闭
    await browser.close();
  }
}

module.exports = {
  downloadM3U8Manifest
};